// connect.js
const coordtransform = require('coordtransform');
const app = getApp();

// // WGS-84（国际标准）---> 百度坐标 (BD-09)
// const [lng, lat] = coordtransform.bd09togcj02(119.11275248,26.02307089);
// console.log(`腾讯坐标：[${lng}, ${lat}]`);

Page({
  data: {
		latitude: 0,
		longitude: 0,
    number: '', // 车牌号
    host: 'defd6a68fa.st1.iotda-app.cn-north-4.myhuaweicloud.com', // 华为云物联网平台的接入地址
    projectId: 'ccd53ceb530f4859b3ba4d16326df57e', // 项目ID
    deviceId: '6804b3f19314d1185113e171_lock_0', // 设备ID
    password: '7b05d72adf4874e28d5fd773076d77cf22dfb47dfd7286aa78d48d62ff1d37a9',
    token: '', // 用于存储Token
    log: '',
    // 地图上可以显示多个标注点，每个标注点的位置、图标和提示内容可能不同。
    markers: [
      {
        // 每个标注点都有一个唯一的 id，用于区分不同的标注点。
        id: 1, // 标注点的唯一标识
				iconPath: "/images/定位.png", // 标注点的图标路径
				latitude: 0,
				longitude: 0,
        width: 30, // 图标的宽度
        height: 30, // 图标的高度
      },
    ],
  },

  // 页面加载时自动获取设备属性
  onShow() {
    this.getAuthToken().then(token => {
      this.setData({ token }); // 保存 Token 到页面数据
      app.globalData.token = token; // 保存 Token 到全局变量
      this.getDeviceShadow(); // 获取设备影子
      this.startPolling(); // 开始轮询获取设备影子
    }).catch(error => {
      this.log('获取Token失败', error);
      wx.showToast({
        title: '获取Token失败',
        icon: 'none',
        duration: 2000
      });
    });
  },

  // 获取 IAM Token
  getAuthToken: function () {
    const endpoint = 'https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens';
    const options = {
      method: 'POST',
      header: {
        'Content-Type': 'application/json'
      },
      data: JSON.stringify({
        auth: {
          identity: {
            password: {
              user: {
                name: 'bbb_ch', // 替换为你的 IAM 账号
                password: '123456cl', // 替换为你的 IAM 密码
                domain: {
                  name: 'aaa_ch' // 替换为你的主账号名字
                }
              }
            },
            methods: ['password']
          },
          scope: {
            domain: {
              name: 'aaa_ch' // 替换为你的主账号名字
            }
          }
        }
      })
    };

    return new Promise((resolve, reject) => {
      wx.request({
        url: endpoint,
        method: options.method,
        header: options.header,
        data: options.data,
        success: (res) => {
          if (res.statusCode === 201) {
            resolve(res.header['X-Subject-Token']);
          } else {
            reject(res.data);
          }
        },
        fail: (err) => {
          reject(err);
        }
      });
    });
  },

  // 获取设备影子
  getDeviceShadow: function () {
    const self = this;
    const { host, projectId, deviceId, token } = this.data;
    const endpoint = `https://${host}/v5/iot/${projectId}/devices/${deviceId}/shadow`;

    const options = {
      method: 'GET',
      header: {
        'Content-Type': 'application/json',
        'X-Auth-Token': token // 使用获取到的 Token
      }
    };

    wx.request({
      url: endpoint,
      method: options.method,
      header: options.header,
      success: (res) => {
        if (res.statusCode === 200) {
          self.log('设备影子原始数据', res.data);
          const lock = res.data.shadow[0]; // 假设返回的影子数据在 shadow 数组的第一个对象中
          const gnssData = res.data.shadow[1]; // 假设返回的影子数据在 shadow 数组的第一个对象中
          if (lock && lock.reported && lock.reported.properties) {
            const properties = lock.reported.properties;
            self.setData({
              lock: properties.lock_state || 0,
            });
          } else {
            self.log('设备影子数据格式不正确', res.data);
            wx.showToast({
              title: '设备影子数据格式不正确',
              icon: 'none',
              duration: 2000
            });
          }

          if (gnssData && gnssData.reported && gnssData.reported.properties) {
            const properties = gnssData.reported.properties;
            self.setData({
              // longitude: 119.10619678909552, // 标注点的纬度
              // latitude: 26.01741320981675, // 标注点的经度
              longitude: properties.longitude || 0,
              latitude: properties.latitude || 0,
              markers: [
                {
                  id: 1, // 标注点的唯一标识
                  latitude: properties.latitude || 0,
                  longitude: properties.longitude || 0,
                  iconPath: "/images/定位.png", // 标注点的图标路径
                  width: 30, // 图标的宽度
                  height: 30, // 图标的高度
                },
              ],
            });
          } else {
            self.log('设备影子数据格式不正确', res.data);
            wx.showToast({
              title: '设备影子数据格式不正确',
              icon: 'none',
              duration: 2000
            });
          }

        } else {
          self.log('获取设备影子失败', res.data);
          wx.showToast({
            title: '获取设备影子失败',
            icon: 'none',
            duration: 2000
          });
        }
      },
      fail: (err) => {
        self.log('请求失败', err);
        wx.showToast({
          title: '请求失败',
          icon: 'none',
          duration: 2000
        });
      }
    });
  },

  // 开始轮询获取设备影子
  startPolling: function () {
    const self = this;
    setInterval(() => {
      self.getDeviceShadow();
    }, 5000); // 每5秒轮询一次
  },

  bindInput(event) {
    console.log(event)
    this.setData({
      number: event.detail.value,
    });
  },

  onOpen(event) {
    const that = this;
    var message = {
      lock:1,
    };
    wx.showToast({ title: '发送命令', icon: 'none' });
    console.log(JSON.stringify(message));
    // 发送 MQTT 消息
    that.messageDown(message);
  },


  onClose(){
    const that = this;
    var message = {
      lock:0,
    };
    wx.showToast({ title: '发送命令', icon: 'none' });
    console.log(JSON.stringify(message));
    // 发送 MQTT 消息
    that.messageDown(message);
  },

  confirm(event) {
    const that = this;

    if (that.data.number.length === 0) {
      wx.showToast({ title: '请输入正确的车牌号', icon: 'none' });
      return;
    }

    var message = {
      num:that.data.number,
    };
    wx.showToast({ title: '下发车牌号', icon: 'none' });
    console.log(JSON.stringify(message));
    // 发送 MQTT 消息
    that.messageDown(message);
  },

  // 下发设备消息
  messageDown: function (message) {
    const self = this;
    const { host, projectId, deviceId } = this.data;
    const endpoint = `https://${host}/v5/iot/${projectId}/devices/${deviceId}/messages`;

    const options = {
      method: 'POST',
      header: {
        'Content-Type': 'application/json',
        'X-Auth-Token': app.globalData.token // 使用获取到的 Token
      }
    };

    wx.request({
      url: endpoint,
      method: options.method,
      header: options.header,
      data:{
        message:message,
      },
      success: (res) => {
        console.log(res);
      },
      fail: (err) => {
        self.log('请求失败', err);
        wx.showToast({
          title: '请求失败',
          icon: 'none',
          duration: 2000
        });
      }
    });
  },
  
  // 日志记录
  log(msg, data) {
    console.log(new Date() + ' - ' + msg, data);
    this.setData({
      log: this.data.log + new Date() + ' - ' + msg + '\r\n'
    });
  }
});